/// Support for doing something awesome.
///
/// More dartdocs go here.
library;

export 'src/func_base.dart';

// TODO: Export any libraries intended for clients of this package.
// 定义一个顶级变量，用于测试词法作用域
bool topLevel = true;

// 主函数，是程序的入口点
void main() {
  // 定义一个在 main 函数作用域内的变量
  var insideMain = true;

  // 定义一个函数，展示函数内部的作用域和变量访问
  void myFunction() {
    var insideFunction = true;

    // 定义一个嵌套函数，展示嵌套函数如何访问外部作用域的变量
    void nestedFunction() {
      var insideNestedFunction = true;

      // 嵌套函数可以访问所有外层作用域的变量
      assert(topLevel);
      assert(insideMain);
      assert(insideFunction);
      assert(insideNestedFunction);
    }

    // 调用嵌套函数
    nestedFunction();
  }

  // 调用 myFunction 函数
  myFunction();

  // 测试函数作为一等公民，将函数赋值给变量
  var addFunction = (int a, int b) => a + b;
  assert(addFunction(3, 5) == 8);

  // 测试闭包，通过 makeMultiplier 函数创建闭包
  var multiplier = makeMultiplier(5);
  assert(multiplier(4) == 20);

  // 测试生成器函数，同步生成器
  var naturalNumbers = naturalsTo(10).toList();
  print('自然数序列: $naturalNumbers');

  // 测试异步生成器函数
  asynchronousNaturalsTo(5).listen((number) {
    print('异步生成的自然数: $number');
  });

  // 测试函数的参数，命名参数和可选位置参数
  var namedParamsResult = enableFlags(bold: true, hidden: false);
  print('命名参数函数调用结果: $namedParamsResult');

  var optionalParamsResult = say('Alice', 'Hello', 'phone');
  print('可选位置参数函数调用结果: $optionalParamsResult');

  // 测试函数的相等性
  void functionA() {}
  void functionB() {}

  assert(functionA != functionB);



  var instance1 = ClassC();
  var instance2 = ClassC();

  assert(instance1.methodC != instance2.methodC);
}

class ClassC {
   void methodC() {}
}

// 定义一个函数，展示命名参数的使用
String enableFlags({bool? bold, bool? hidden}) {
  var result = 'Flags: ';
  if (bold != null) {
    result += 'bold: $bold, ';
  }
  if (hidden != null) {
    result += 'hidden: $hidden, ';
  }
  return result;
}

// 定义一个函数，展示可选位置参数的使用
String say(String from, String msg, [String? device = 'unknown device']) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

// 定义一个函数，返回一个闭包，展示闭包的概念
Function makeMultiplier(int factor) {
  return (int num) => num * factor;
}

// 定义一个同步生成器函数，生成从 0 到 n 的自然数序列
Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++;
}

// 定义一个异步生成器函数，异步生成从 0 到 n 的自然数序列
Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) yield k++;
}